#include "stdafx.h"
#include "Matrix44f.h"
#include <cmath>

//-------------------------------------------------------------------------
// constructors
//-------------------------------------------------------------------------

matrix44f::matrix44f()
{
	for (int i=0; i<16; i++)
	{
		m[i] = 0.0f;
	}
}

//-------------------------------------------------------------------------

matrix44f::matrix44f(float a0, float a1, float a2, float a3,
					 float a4, float a5, float a6, float a7,
					 float a8, float a9, float a10, float a11,
					 float a12, float a13, float a14, float a15)
{
	m[0]  = a0;  m[1]  = a1;  m[2]  = a2;  m[3]  = a3;
	m[4]  = a4;  m[5]  = a5;  m[6]  = a6;  m[7]  = a7;
	m[8]  = a8;  m[9]  = a9;  m[10] = a10; m[11] = a11;
	m[12] = a12; m[13] = a13; m[14] = a14; m[15] = a15;
}

//-------------------------------------------------------------------------
// overloaded operators
//-------------------------------------------------------------------------

matrix44f matrix44f::operator * (matrix44f n)
{
	return 
	matrix44f(n.m[0]*m[0]  + n.m[1]*m[4]  + n.m[2]*m[8]   + n.m[3]*m[12],
		      n.m[0]*m[1]  + n.m[1]*m[5]  + n.m[2]*m[9]   + n.m[3]*m[13],
			  n.m[0]*m[2]  + n.m[1]*m[6]  + n.m[2]*m[10]  + n.m[3]*m[14],
			  n.m[0]*m[3]  + n.m[1]*m[7]  + n.m[2]*m[11]  + n.m[3]*m[15],
			  n.m[4]*m[0]  + n.m[5]*m[4]  + n.m[6]*m[8]   + n.m[7]*m[12],
			  n.m[4]*m[1]  + n.m[5]*m[5]  + n.m[6]*m[9]   + n.m[7]*m[13],
			  n.m[4]*m[2]  + n.m[5]*m[6]  + n.m[6]*m[10]  + n.m[7]*m[14],
			  n.m[4]*m[3]  + n.m[5]*m[7]  + n.m[6]*m[11]  + n.m[7]*m[15],
			  n.m[8]*m[0]  + n.m[9]*m[4]  + n.m[10]*m[8]  + n.m[11]*m[12],
			  n.m[8]*m[1]  + n.m[9]*m[5]  + n.m[10]*m[9]  + n.m[11]*m[13],
			  n.m[8]*m[2]  + n.m[9]*m[6]  + n.m[10]*m[10] + n.m[11]*m[14],
			  n.m[8]*m[3]  + n.m[9]*m[7]  + n.m[10]*m[11] + n.m[11]*m[15],
			  n.m[12]*m[0] + n.m[13]*m[4] + n.m[14]*m[8]  + n.m[15]*m[12],
			  n.m[12]*m[1] + n.m[13]*m[5] + n.m[14]*m[9]  + n.m[15]*m[13],
			  n.m[12]*m[2] + n.m[13]*m[6] + n.m[14]*m[10] + n.m[15]*m[14],
			  n.m[12]*m[3] + n.m[13]*m[7] + n.m[14]*m[11] + n.m[15]*m[15]);
}

//-------------------------------------------------------------------------

matrix44f::UnitRotationMatrix()
{
	m[0]  = 1.0f;  m[1]  = 0.0f;  m[2]  = 0.0f;  m[3]  = 0.0f;
	m[4]  = 0.0f;  m[5]  = 1.0f;  m[6]  = 0.0f;  m[7]  = 0.0f;
	m[8]  = 0.0f;  m[9]  = 0.0f;  m[10] = 1.0f;  m[11] = 0.0f;
	m[12] = 0.0f;  m[13] = 0.0f;  m[14] = 0.0f;  m[15] = 1.0f;
}
